<?php

/**
*Clase que manipula los articulos.
*
*Esta clase agrega, modifica articulos e informa si existe stock disponible de dicho 
*articulo.
*
*@author gush
*@author pegudo
*@package controller
*/
Class ArticulosController extends AppController {
	var $name = 'Articulos';
	//var $helpers = array('Html', 'Javascript', 'Ajax');
	
	function index()
	{
		//cargamos el submenu
		$this->setearSubMenu();
		
//		$idCliente = 4;
//		$fecha = date("Y-m-d");
//		$tipoProcesamiento = 'cajasCustodiadas';
//		$cajas = $this->requestAction("informes/procesarInformeCliente/$idCliente/$fecha/$tipoProcesamiento/");
//		pr($cajas);
		
		$conditions = null;
		$fields = array('id','nombre','cantidad');
		$this->set('articulos',$this->Articulo->findAll($conditions,$fields));
	}
	
	function cantidadArticulo($idArticulo)
	{
		$articulo = $this->Articulo->findById($idArticulo);
		return($articulo['Articulo']['cantidad']);
	}

	function setearVariables()
	{
	//seteamos las variables de error para ser mostradas en caso de no poder guardar los datos
		$this->set('status', 'Los datos del articulo deben ser completados.');
		$error = array 
		(
			'Articulo/nombre' => 'El nombre ya existe o contiene caracteres no permitidos.',
			'Articulo/cantidad' => 'El nombre ya existe o contiene caracteres no permitidos.'
		);
		$this->set('error',$error);
	}

/**
*Funcion que devuelve una lista de los articulos 
*
*Devuelve una lista de articulos que empiezan con la letra pasada por parametro.
*
*@return array
*@param string $primeraParte primera parte del nombre de un articulo
*/	

	function listarArticulos($primeraParte=null)
	{
			$fields = null;//array('id','nombre');
			$condicion = array ("nombre" => "LIKE $primeraParte%");
			return($this->Articulo->findAll($condicion,$fields,null,null,1,0));
	}
	
	function seleccionar()
	{
		//seteo el submenu
		$this->setearSubMenu();
		//setea los clientes
		$articulos = $this->requestAction('/articulos/seleccionarArticulos');
		$this->set('articulos',$articulos);
	}

	function seleccionarArticulos() 
	{
		return $this->Articulo->generateList(null,'nombre ASC', null, '{n}.Articulo.id','{n}.Articulo.nombre' );
	}
	
	//agrega un articulo con su respectiva relacion de servicio 
	//tanto para su alta como para su baja
	function add() 
	{
		$this->setearSubMenu();
		
		//setea la variables de errores y status
		$this->setearVariables();
		
		//Si los campos no estan vacios
		if(!empty($this->data))
		{	
			$this->Articulo->data = $this->data;
			if($this->Articulo->validates())
			{	

				//si esta seteado se crean los articulos relacionados
				if($this->data['Articulo']['crear_servicios'])
				{
					$var = $this->data['Articulo']['nombre'];
					//agrego el servicio
					$nombre = "Compra de $var";
					$idServicio=$this->requestAction("servicios/addServicio/$nombre");
					$this->data['Articulo']['servicio_alta']=$idServicio;
					//agrego el servicio obtenido con vencimiento default
					$vencimiento=null;
					$this->requestAction("servicioobtenidos/add/$idServicio/$vencimiento/");
					
					$nombre = "Venta de $var";
					$idServicio=$this->requestAction("servicios/addServicio/$nombre");
					$this->data['Articulo']['servicio_baja']=$idServicio;
					//agrego el servicio obtenido con vencimiento default
					$precio_sugerido='0';
					$this->requestAction("serviciobrindados/add/$idServicio/$precio_sugerido/");
				}
				
				$this->Articulo->save($this->data);
				$this->render('index');
				$this->set('status', 'Los datos han sido agregados con exito.');
			}
			else 
				$this->set('status', 'Error: El nombre ingresado ya esta en uso.');
		}
	}
	
	function modify ($idArticulo=null) {
		$this->setearSubMenu();
		//setea la variables de errores y status
		$this->setearVariables();
		//si el modify da un error el parametro idArticulo
		//se lo pierdo entonces se lo extrae de la vista.
		if($idArticulo==null)
			$idArticulo = $this->data['Articulo']['id'];
			
		//setea los servicios brindados
		$serviciosBrindados = $this->requestAction('/servicios/seleccionarServiciosBrindados');
		$this->set('serviciosBrindados',$serviciosBrindados);
		
		//si es custodia de cajas la baja debe ser un servicio brindado (custodia de cajas)
		$iIdCajasCustodiadas = $this->getConfigIni('Articulos');
		$iIdCajasCustodiadas = $iIdCajasCustodiadas['iIdCajasCustodiadas'];
		if($idArticulo==$iIdCajasCustodiadas){
			$this->set('serviciosObtenidos',$serviciosBrindados);
		}
		else{
			//setea los servicios obtenidos
			$serviciosObtenidos = $this->requestAction('/servicios/seleccionarServiciosObtenidos');
			$this->set('serviciosObtenidos',$serviciosObtenidos);
		}
				
		//SETEA LOS DATOS PARA EDITARLOS
		if (empty($this->data['Articulo']['nombre'])||empty($this->data['Articulo']['cantidad'])) 
		{ 
			$this->Articulo->id = $idArticulo;
			$this->data = $this->Articulo->read();
 		}
		else //MODIFICA LOS DATOS*/
		{	
			$this->Articulo->data = $this->data;
			if($this->Articulo->validates())
			{	
				$this->Articulo->save($this->data);
			}
			else 
				$this->set('statusPersona', 'Existen errores con Persona');
		}
	}

/**
*Esta funcion informa si existe la cantidad necesaria de articulos para darlos de baja.
*
*Se fija todos los articulos que dependen del servicio pasado por parametro y devuelve
*verdadero si es posible darlos de baja.
*@return boolean
*@param integer $idServicio el id del servicio que se esta ejecutando
*@param integer $cantidad es la cantidad de servicios que se esta requiriendo.
*@author gush
*/
	function disponibleStock($idServicio,$cantidad)
	{
		//busca si existe disponibilidad para dar de baja el servicio
		$condicion = array('servicio_baja' => $idServicio);
		$articulos = $this->Articulo->findAll($condicion);
		$res = 1;
		foreach($articulos as $articulo)
			if($articulo['Articulo']['cantidad']<$cantidad)
				$res = 0;
		return $res==1;
	}
	
/**
*Esta funcion informa si existe la cantidad necesaria de articulos para darlos de baja.
*
*Se fija todos los articulos que dependen del servicio pasado por parametro y devuelve
*verdadero si es posible darlos de baja.
*@return boolean
*@param integer $idServicio el id del servicio que se esta ejecutando
*@param integer $cantidad es la cantidad de servicios que se esta requiriendo.
*@author gush
*/
	function disponibleExpurgueCajas($idServicio,$idCliente,$cantidad)
	{
		$idExpurgue = 3; 	//id del servicio de expurgue
		$idArticulo = 1;	//id del articulo cajas custodiadas

		if($idServicio==$idExpurgue)
		{
			$cantidadDisp = $this->requestAction("clientes/getCantidadArticulo/$idCliente/$idArticulo/");
			$cantidadDisp = $cantidadDisp['altas'] - $cantidadDisp['bajas'];
			if($cantidadDisp>=$cantidad)
				$resultado = true;//existe disponibilidad
			else
				$resultado = false;//no existe disponibilidad
		}
		else
			$resultado = true;//el servicio no es el de expurgue
			
		return $resultado;
	}	


/**
*Funcion que devuelve una lista de los id de los servicios asociados a un servicio de alta.
*
*
*@return array
*@param 
*/
	function listarServicioAlta()
	{
	$ret = '';
	$conditions = array("Articulo.servicio_alta <> ''");
	$fields = array('servicio_alta');
	$ret=  $this->Articulo->findAll($conditions,$fields);
	for ($i=0 ; $i < sizeof($ret); $i++)
	{
		$data[]= $ret[$i]['Articulo']['servicio_alta'];
	}
	//pr($data);
	return $data;
	}
	

	function actualizarStock($idServicio,$cantidad)
	{
		//busca si existe 
		$query = "update articulos a set a.cantidad = a.cantidad - $cantidad where a.servicio_baja = $idServicio";
		$this->Articulo->execute($query);
		$query = "update articulos a set a.cantidad = a.cantidad + $cantidad where a.servicio_alta = $idServicio";
		$this->Articulo->execute($query);		
	}

	function setearSubMenu(){
		$aSubMenu[0]['title'] = 'Agregar';
		$aSubMenu[0]['href']	 = PATH . 'articulos/add';
		$aSubMenu[0]['image']	 = '';
		
		$aSubMenu[1]['title'] = 'Modificar';
		$aSubMenu[1]['href']	 = PATH . 'articulos/seleccionar';
		$aSubMenu[1]['image']	 = '';
		
		$aSubMenu[2]['title'] = 'Listar';
		$aSubMenu[2]['href']	 = PATH . 'articulos/';
		$aSubMenu[2]['image']	 = '';
			
		
		$this->set('aSubMenu', $aSubMenu);
	
	}


}
?>